package com.lym.order.config;

import feign.Logger;
import feign.Retryer;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * 订单服务配置类
 */
@Configuration
public class OrderServiceConfig {

    /**
     * RestTemplate
     * RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端，
     * 它提供了多种便捷访问远程 HTTP 服务的方法，
     * 封装了 HTTP 请求，并自动将 Java 对象序列化为 JSON。
     * RestTemplate 提供的常用方法：
     * getForObject()
     * getForEntity()
     * postForLocation()
     * postForObject()
     * put()
     * delete()
     * exchange()
     * head()
     * optionsForAllow()
     * @see <a href="https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html">RestTemplate</a>
     * @return
     */
    @LoadBalanced // 注解式负载均衡
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    /**
     * Feign 日志级别
     * 全记录组件
     *
     * @return
     */
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }

    /**
     * Feign 重试机制
     *
     * @return
     */
    @Bean
    Retryer feignRetryer() {
        // 这里实现默认提供的重试机制(间隔策略) : this(100L, TimeUnit.SECONDS.toMillis(1L), 5)
        // 当然我们也可以重写来实现自己定义的策略,相对应的参数是: 重试间隔、最大重试间隔、最大重试次数
        return new Retryer.Default();
    }

}
